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()
46 if((sizeof(Int_t) != 4) || (sizeof(Short_t) != 2)){
47 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::AliL3RawDataFileHandler","Constructor")
48 <<"Check architecture to run the conversion on! Int_t should be 32 and Short_t should be 16 bit."<<ENDLOG;
52 AliL3RawDataFileHandler::~AliL3RawDataFileHandler()
58 void AliL3RawDataFileHandler::FreeAll()
61 if(fInRaw) CloseRawInput();
62 if(fInRawPed) CloseRawPedestalsInput();
63 if(fMapping) CloseMappingFile();
69 if(fPedestals) delete[] fPedestals;
70 if(fCharges) delete[] fCharges;
71 if(fOutRaw) CloseRawOutput();
83 fRowMinUsed=AliL3Transform::GetNRows();
88 for(Int_t i=0;i<AliL3Transform::GetNRows();i++) fNPads[i]=0;
92 Bool_t AliL3RawDataFileHandler::SetRawInput(Char_t *name)
96 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawInput","File Open")
97 <<"File ptr is already in use, close file first"<<ENDLOG;
101 //Open the raw data file with name.
102 fInRaw = new ifstream();
104 fInRaw->open(name,fstream::binary);
109 #if defined(__HP_aCC) || defined(__DECCXX)
110 if(!fInRaw->rdbuf()->is_open()){
112 if(!fInRaw->is_open()){
114 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawInput","File Open")
115 <<"Pointer to ifstream = 0x0"<<ENDLOG;
122 Bool_t AliL3RawDataFileHandler::SetRawInput(ifstream *file)
126 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawInput","File Open")
127 <<"File ptr is already in use, close file first"<<ENDLOG;
131 //Open the raw data file with given file.
133 #if defined(__HP_aCC) || defined(__DECCXX)
134 if(!fInRaw->rdbuf()->is_open()){
136 if(!fInRaw->is_open()){
138 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawInput","File Open")
139 <<"Pointer to ifstream = 0x0"<<ENDLOG;
146 void AliL3RawDataFileHandler::CloseRawInput()
150 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::CloseRawInput","File Close")
151 <<"Nothing to Close"<<ENDLOG;
154 #if defined(__HP_aCC) || defined(__DECCXX)
155 if(fInRaw->rdbuf()->is_open()) fInRaw->close();
157 if(fInRaw->is_open()) fInRaw->close();
163 Bool_t AliL3RawDataFileHandler::SetRawOutput(Char_t *name)
167 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawOutput","File Open")
168 <<"File ptr is already in use, close file first"<<ENDLOG;
172 fOutRaw = new ofstream();
174 fOutRaw->open(name,fstream::binary);
179 #if defined(__HP_aCC) || defined(__DECCXX)
180 if(!fOutRaw->rdbuf()->is_open()){
182 if(!fOutRaw->is_open()){
184 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawOutput","File Open")
185 <<"Pointer to ofstream = 0x0"<<ENDLOG;
192 Bool_t AliL3RawDataFileHandler::SetRawOutput(ofstream *file)
196 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawOutput","File Open")
197 <<"File ptr is already in use, close file first"<<ENDLOG;
201 //Open the raw data file with given file.
204 #if defined(__HP_aCC) || defined(__DECCXX)
205 if(!fOutRaw->rdbuf()->is_open()){
207 if(!fOutRaw->is_open()){
209 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawOutput","File Open")
210 <<"Pointer to ofstream = 0x0"<<ENDLOG;
217 void AliL3RawDataFileHandler::CloseRawOutput()
221 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::CloseRawOutput","File Close")
222 <<"Nothing to Close"<<ENDLOG;
225 #if defined(__HP_aCC) || defined(__DECCXX)
226 if(fOutRaw->rdbuf()->is_open()) fOutRaw->close();
228 if(fOutRaw->is_open()) fOutRaw->close();
235 Bool_t AliL3RawDataFileHandler::SetRawPedestalsInput(Char_t *name)
239 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawPedestalsInput","File Open")
240 <<"File ptr is already in use, close file first"<<ENDLOG;
244 //Open the raw data file with name.
245 fInRawPed = new ifstream();
247 fInRawPed->open(name,fstream::binary);
249 fInRawPed->open(name);
252 #if defined(__HP_aCC) || defined(__DECCXX)
253 if(!fInRawPed->rdbuf()->is_open()){
255 if(!fInRawPed->is_open()){
257 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawPedestalsInput","File Open")
258 <<"Pointer to ifstream = 0x0"<<ENDLOG;
265 Bool_t AliL3RawDataFileHandler::SetRawPedestalsInput(ifstream *file)
267 //set raw pedestals input
269 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawPedestalsInput","File Open")
270 <<"File ptr is already in use, close file first"<<ENDLOG;
274 //Open the raw data file with given file.
276 #if defined(__HP_aCC) || defined(__DECCXX)
277 if(!fInRawPed->rdbuf()->is_open()){
279 if(!fInRawPed->is_open()){
281 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawPedestalsInput","File Open")
282 <<"Pointer to ifstream = 0x0"<<ENDLOG;
289 void AliL3RawDataFileHandler::CloseRawPedestalsInput()
291 //close raw pedestals input
293 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::CloseRawPedestalsInput","File Close")
294 <<"Nothing to Close"<<ENDLOG;
297 #if defined(__HP_aCC) || defined(__DECCXX)
298 if(fInRawPed->rdbuf()->is_open()) fInRawPed->close();
300 if(fInRawPed->is_open()) fInRawPed->close();
306 Bool_t AliL3RawDataFileHandler::SetMappingFile(Char_t *name)
310 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetMapping","File Open")
311 <<"File ptr is already in use, close file first"<<ENDLOG;
315 fMapping = fopen(name,"r");
317 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::SetMappingFile","File Open")
318 <<"Pointer to file = 0x0"<<ENDLOG;
325 Bool_t AliL3RawDataFileHandler::SetMappingFile(FILE *file)
329 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetMapping","File Open")
330 <<"File ptr is already in use, close file first"<<ENDLOG;
336 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::SetMappingFile","File Open")
337 <<"Pointer to file = 0x0"<<ENDLOG;
344 void AliL3RawDataFileHandler::CloseMappingFile()
348 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::CloseMappingFile","File Close")
349 <<"Nothing to Close"<<ENDLOG;
356 Int_t AliL3RawDataFileHandler::ReadMappingFile()
360 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadMappingFile","File Open")
361 <<"Pointer to file = 0x0"<<ENDLOG;
366 fgets(dummy,80,fMapping);
369 fscanf(fMapping,"%s %d %s %d",dummy,&nboard,dummy,&nadc);
371 fNChannels=nboard*nadc;
373 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::ReadMappingFile","Data Inconsistency")
374 <<"fNChannels must be greater than 0"<<ENDLOG;
378 fRow=new Byte_t[fNChannels];
379 fPad=new Byte_t[fNChannels];
380 fRowPad=new Short_t*[AliL3Transform::GetNRows()];
381 for(Int_t i=0; i < AliL3Transform::GetNRows(); i++){
382 fRowPad[i]=new Short_t[AliL3Transform::GetNPads(i)];
383 for(Int_t j=0; j < AliL3Transform::GetNPads(i); j++) fRowPad[i][j]=-1;
386 for(UInt_t i=0;i<fNChannels;i++){
387 Int_t board,adc,row,pad;
388 if(fscanf(fMapping,"%d %d %d %d",&board,&adc,&row,&pad)!=4) break;
393 if(row>fRowMaxUsed) fRowMaxUsed=row;
394 if(row<fRowMinUsed) fRowMinUsed=row;
395 if(pad>fPadMaxUsed) fPadMaxUsed=pad;
396 if(pad<fPadMinUsed) fPadMinUsed=pad;
399 //cout << i << " " << row << " " << pad << endl;
406 inline Int_t AliL3RawDataFileHandler::Convert4(Int_t i) const
408 //BigEndian i0i1i2i3 -> LittleEndian i3i2i1i0
409 if(!fConvert) return i;
410 Char_t *p=(Char_t*)&i;
416 return (*(Int_t*)temp);
419 inline Short_t AliL3RawDataFileHandler::Convert2(Short_t s) const
421 //BigEndian i0i1 -> LittleEndian i1i0
422 if(!fConvert) return s;
423 Char_t *p=(Char_t*)&s;
427 return (*(Short_t*)temp);
430 Int_t AliL3RawDataFileHandler::ReadRawInput()
432 //Read data from cosmics file into memory
434 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawInput","File Open")
435 <<"No Input avalible: no object ifstream"<<ENDLOG;
439 #if defined(__HP_aCC) || defined(__DECCXX)
440 if(!fInRaw->rdbuf()->is_open()){
442 if(!fInRaw->is_open()){
444 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawInput","File Open")
445 <<"No Input avalible: ifstream not opened"<<ENDLOG;
451 fInRaw->read((Char_t*)&dummy4,sizeof(dummy4));
452 if(dummy4==(Int_t)fNChannels) fConvert=kFALSE;
454 Int_t knumofChannels = Convert4(dummy4);
455 if(knumofChannels!=(Int_t)fNChannels){
456 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawInput","Data Inconsistency")
457 <<"Number of Channels should be equal to fNChannels "<<knumofChannels<<" "<<fNChannels<<ENDLOG;
462 //read used altrochannels (for the moment
463 //this information is not really needed as
464 //all channels per FEC are used
465 for(UInt_t i = 0 ; i < fNChannels ; i++){
466 fInRaw->read((Char_t*)&dummy2,sizeof(dummy2));
467 UShort_t channel = Convert2(dummy2);
468 if(channel>fNChannels){
469 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::ReadRawInput","Data Inconsistency")
470 <<AliL3Log::kDec<<"Channel number must be smaller then fNChannels "<<channel<<" "<<fNChannels<<ENDLOG;
475 fInRaw->read((Char_t*)&dummy4,sizeof(dummy4));
476 Int_t numofChannelsTest = Convert4(dummy4);
478 if (numofChannelsTest != (Int_t)fNChannels){
479 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::ReadRawInput","Data Inconsistency")
480 <<AliL3Log::kDec<<"Number of test channels should be equal to fNChannels "<<numofChannelsTest<<" "<<fNChannels<<ENDLOG;
485 fInRaw->read((Char_t*)&dummy4,sizeof(dummy4));
486 fNTimeBins=Convert4(dummy4);
488 if(fNTimeBins!=AliL3Transform::GetNTimeBins()){
489 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawInput","Data Inconsistency")
490 <<AliL3Log::kDec<<"fNTimeBins does not match AliL3Transformer, check AliL3Transform::Init() "<<fNTimeBins<<" "<<AliL3Transform::GetNTimeBins()<<ENDLOG;
494 if(fCharges) delete[] fCharges;
495 fCharges=new Short_t*[fNChannels];
496 for(UInt_t c=0;c<fNChannels;c++) fCharges[c]=new Short_t[fNTimeBins];
499 for(UInt_t channel = 0; channel < fNChannels; channel++){
500 for(Int_t timebin = 0 ; timebin < fNTimeBins ; timebin++){
502 fInRaw->read((Char_t*)&dummy2,sizeof(dummy2));//1024012));
503 Short_t charge = Convert2(dummy2);
505 //Pedestal substraction
506 if(fPedestals) charge-=fPedestals[channel][timebin];
507 else charge-=fPedVal;
508 if(charge<0) charge=0;
510 fCharges[channel][timebin]=charge;
516 Int_t AliL3RawDataFileHandler::ReadRawInputPointer(const Char_t *ptr)
518 //Read data from cosmics pointer into memory
520 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawInputPointer","Pointer")
521 <<"Pointer equals 0x0!"<<ENDLOG;
526 dummy4=*(Int_t*)ptr; ptr+=sizeof(dummy4);
527 if(dummy4==(Int_t)fNChannels) fConvert=kFALSE;
529 Int_t knumofChannels = Convert4(dummy4);
530 if(knumofChannels!=(Int_t)fNChannels){
531 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawInputPointer","Data Inconsistency")
532 <<"Number of Channels should be equal to fNChannels "<<knumofChannels<<" "<<fNChannels<<ENDLOG;
536 //read used altrochannels (for the moment
537 //this information is not really needed as
538 //all channels per FEC are used
539 for(UInt_t i = 0 ; i < fNChannels ; i++){
540 dummy2=*(Short_t*)ptr; ptr+=sizeof(dummy2);
541 UShort_t channel = Convert2(dummy2);
542 if(channel>fNChannels){
543 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::ReadRawInputPointer","Data Inconsistency")
544 <<AliL3Log::kDec<<"Channel number must be smaller then fNChannels "<<channel<<" "<<fNChannels<<ENDLOG;
548 dummy4=*(Int_t*)ptr; ptr+=sizeof(dummy4);
549 Int_t numofChannelsTest = Convert4(dummy4);
550 if (numofChannelsTest != (Int_t)fNChannels){
551 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::ReadRawInputPointer","Data Inconsistency")
552 <<AliL3Log::kDec<<"Number of test channels should be equal to fNChannels "<<numofChannelsTest<<" "<<fNChannels<<ENDLOG;
556 dummy4=*(Int_t*)ptr; ptr+=sizeof(Int_t);
557 fNTimeBins=Convert4(dummy4);
558 if(fNTimeBins!=AliL3Transform::GetNTimeBins()){
559 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawInputPointer","Data Inconsistency")
560 <<AliL3Log::kDec<<"fNTimeBins does not match AliL3Transformer, check AliL3Transform::Init() "<<fNTimeBins<<" "<<AliL3Transform::GetNTimeBins()<<ENDLOG;
563 if(fCharges) delete[] fCharges;
564 fCharges=new Short_t*[fNChannels];
565 for(UInt_t c=0;c<fNChannels;c++) fCharges[c]=new Short_t[fNTimeBins];
567 for(UInt_t channel = 0; channel < fNChannels; channel++){
568 for(Int_t timebin = 0 ; timebin < fNTimeBins ; timebin++){
569 Short_t dummy2=*(Short_t*)ptr;
570 Short_t charge = Convert2(dummy2);
572 //Pedestal substraction
573 if(fPedestals) charge-=fPedestals[channel][timebin];
574 else charge-=fPedVal;
575 if(charge<0) charge=0;
577 fCharges[channel][timebin]=charge;
586 Short_t** AliL3RawDataFileHandler::GetRawData(Int_t &channels, Int_t &timebins)
594 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::GetRawData","Data Inconsistency")
595 <<"Call AliL3RawDataFileHandler::RawReadInput() first"<<ENDLOG;
597 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::GetRawData","Data Inconsistency")
598 <<"Something went wrong reading data header"<<ENDLOG;
603 charges=new Short_t*[fNChannels];
604 for(UInt_t c=0;c<fNChannels;c++) charges[c]=new Short_t[fNTimeBins];
606 for(UInt_t channel = 0; channel < fNChannels; channel++){
607 for(Int_t timebin = 0 ; timebin < fNTimeBins ; timebin++){
609 fInRaw->read((Char_t*)&dummy2,sizeof(dummy2));
610 Short_t charge = Convert2(dummy2);
611 charges[channel][timebin]=charge;
621 Int_t AliL3RawDataFileHandler::StoreRawData(Short_t **charges)
623 //store charges in the raw data format
625 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::StoreRawData","File Open")
626 <<"No Output avalible: no object ofstream"<<ENDLOG;
630 #if defined(__HP_aCC) || defined(__DECCXX)
631 if(!fOutRaw->rdbuf()->is_open()){
633 if(!fOutRaw->is_open()){
635 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::StoreRawData","File Open")
636 <<"No Output avalible: ofstream not opened"<<ENDLOG;
643 dummy4=Convert4(fNChannels);
645 fOutRaw->write((Char_t*)&dummy4,sizeof(dummy4));
646 for(UInt_t i = 0 ; i < fNChannels ; i++){
647 dummy2 = Convert2(Short_t(i));
648 fOutRaw->write((Char_t*)&dummy2,sizeof(dummy2));
651 dummy4=Convert4(fNChannels);
652 fOutRaw->write((Char_t*)&dummy4,sizeof(dummy4));
655 dummy4=Convert4(fNTimeBins);
656 fOutRaw->write((Char_t*)&dummy4,sizeof(dummy4));
658 for(UInt_t channel = 0; channel < fNChannels; channel++){
659 for(Int_t timebin = 0 ; timebin < fNTimeBins ; timebin++){
660 Short_t charge=charges[channel][timebin];
661 dummy2 = Convert2(charge);
662 fOutRaw->write((Char_t*)&dummy2,sizeof(dummy2));
669 Int_t AliL3RawDataFileHandler::ReadRawPedestalsInput()
671 //read raw pedestals input
673 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawPedestalsInput","File Open")
674 <<"No Input avalible: no object ifstream"<<ENDLOG;
678 #if defined(__HP_aCC) || defined(__DECCXX)
679 if(!fInRawPed->rdbuf()->is_open()){
681 if(!fInRawPed->is_open()){
683 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawPedestalsInput","File Open")
684 <<"No Input avalible: ifstream not opened"<<ENDLOG;
690 fInRawPed->read((Char_t*)&dummy4,sizeof(dummy4));
691 if(dummy4==(Int_t)fNChannels) fConvert=kFALSE;
693 Int_t knumofChannels = Convert4(dummy4);
694 if(knumofChannels!=(Int_t)fNChannels){
695 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawPedestalsInput","Data Inconsistency")
696 <<AliL3Log::kDec<<"Number of Channels should be equal to fNChannels "<<knumofChannels<<" "<<fNChannels<<ENDLOG;
701 //read used altrochannels (for the moment
702 for(UInt_t i = 0 ; i < fNChannels ; i++){
703 fInRawPed->read((Char_t*)&dummy2,sizeof(dummy2));
704 //UShort_t channel = Convert2(dummy2);
707 fInRawPed->read((Char_t*)&dummy4,sizeof(dummy4));
708 //Int_t numofChannelsTest = Convert4(dummy4);
711 fInRawPed->read((Char_t*)&dummy4,sizeof(dummy4));
712 fNTimeBins=Convert4(dummy4);
714 if(fNTimeBins!=AliL3Transform::GetNTimeBins()){
715 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawPedestalsInput","Data Inconsistency")
716 <<AliL3Log::kDec<<"fNTimeBins does not match AliL3Transformer, check AliL3Transform::Init() "<<fNTimeBins<<" "<<AliL3Transform::GetNTimeBins()<<ENDLOG;
720 fPedestals=new Short_t*[fNChannels];
721 for(UInt_t c=0;c<fNChannels;c++) fPedestals[c]=new Short_t[fNTimeBins];
723 for(UInt_t channel = 0; channel < fNChannels; channel++){
724 for(Int_t timebin = 0 ; timebin < fNTimeBins ; timebin++){
726 fInRawPed->read((Char_t*)&dummy2,sizeof(dummy2));
727 Short_t charge = Convert2(dummy2);
728 fPedestals[channel][timebin]=charge;
731 CloseRawPedestalsInput();
735 AliL3DigitRowData * AliL3RawDataFileHandler::RawData2Memory(UInt_t &nrow,Int_t /*event*/)
737 //convert raw data to memory
738 AliL3DigitRowData *data = 0;
742 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::RawData2Memory","Data Inconsistency")
743 <<"Call AliL3RawDataFileHandler::RawReadInput() first"<<ENDLOG;
745 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::RawData2Memory","Data Inconsistency")
746 <<"Something went wrong reading data header"<<ENDLOG;
754 Int_t *ndigits=new Int_t[AliL3Transform::GetNRows()];
755 for(Int_t i=0;i<AliL3Transform::GetNRows();i++) ndigits[i]=0;
757 //no need to search for slice/sector given by init
758 //but check for row/patch boundaries
760 for(Int_t slrow=0;slrow<AliL3Transform::GetNRows();slrow++){
762 if(slrow<fRowMin) continue;
763 if(slrow>fRowMax) break;
765 for(Int_t pad=0;pad<AliL3Transform::GetNPads(slrow);pad++){
766 Short_t channel=fRowPad[slrow][pad];
767 if(channel==-1) continue; //no data on that channel;
769 for(Int_t timebin = 0 ; timebin < fNTimeBins ; timebin++){
770 Int_t dig=fCharges[channel][timebin];
772 if(dig <= AliL3Transform::GetZeroSup()) continue;
773 if(dig >= AliL3Transform::GetADCSat())
774 dig = AliL3Transform::GetADCSat();
776 ndigits[slrow]++; //for this row only
777 ndigitcount++; //total number of digits to be published
781 //count number of rows
785 //test data consistency
786 Int_t ndigitcounttest=0;
787 for(Int_t slrow=0;slrow<AliL3Transform::GetNRows();slrow++)
788 ndigitcounttest+=ndigits[slrow];
789 if(ndigitcount!=ndigitcounttest)
790 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::RawData2Memory","Digits")
791 <<AliL3Log::kDec<<"Found Inconsistency "<<ndigitcount<<" != "<<ndigitcounttest<<ENDLOG;
793 Int_t size = sizeof(AliL3DigitData)*ndigitcount
794 + nrows*sizeof(AliL3DigitRowData);
795 LOG(AliL3Log::kDebug,"AliL3RawDataFileHandler::RawData2Memory","Digits")
796 <<AliL3Log::kDec<<"Found "<<ndigitcount<<" Digits on "<<nrows<<" rows"<<ENDLOG;
799 data=(AliL3DigitRowData*) Allocate(size);
800 nrow = (UInt_t)nrows;
801 //memset(data,1,size); //for debugging
803 Int_t ndigitcounttest2=0;
804 AliL3DigitRowData *tempPt = data;
805 for(Int_t slrow=0;slrow<AliL3Transform::GetNRows();slrow++){
807 if(slrow<fRowMin) continue;
808 if(slrow>fRowMax) break;
810 tempPt->fRow = slrow;
811 tempPt->fNDigit = ndigits[slrow];
814 for(Int_t pad=0;pad<AliL3Transform::GetNPads(slrow);pad++){
815 Short_t channel=fRowPad[slrow][pad];
816 if(channel==-1) continue; //no data on that channel;
818 for(Int_t timebin = 0 ; timebin < fNTimeBins ; timebin++){
819 Int_t dig=fCharges[channel][timebin];
821 if(dig <= AliL3Transform::GetZeroSup()) continue;
822 if(dig >= AliL3Transform::GetADCSat())
823 dig = AliL3Transform::GetADCSat();
825 //Exclude data outside cone:
826 //AliL3Transform::Raw2Local(xyz,sector,row,pad,time);
827 //if(fParam->GetPadRowRadii(sector,row)<230./250.*fabs(xyz[2])) continue;
829 tempPt->fDigitData[localcount].fCharge=(UShort_t)dig;
830 tempPt->fDigitData[localcount].fPad=(UChar_t)pad;
831 tempPt->fDigitData[localcount].fTime=(UShort_t)timebin;
833 tempPt->fDigitData[localcount].fTrackID[0] = 0;
834 tempPt->fDigitData[localcount].fTrackID[1] = 0;
835 tempPt->fDigitData[localcount].fTrackID[2] = 0;
842 if(localcount != ndigits[slrow])
843 LOG(AliL3Log::kFatal,"AliL3RawDataFileHandler::RawData2Memory","Memory")
844 <<AliL3Log::kDec<<"Mismatch: localcount "<<localcount<<" ndigits "
845 <<ndigits[slrow]<<ENDLOG;
847 Byte_t *tmp = (Byte_t*)tempPt;
848 Int_t size = sizeof(AliL3DigitRowData)
849 + ndigits[slrow]*sizeof(AliL3DigitData);
851 tempPt = (AliL3DigitRowData*)tmp;
854 if(ndigitcount!=ndigitcounttest2)
855 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::RawData2Memory","Digits")
856 <<AliL3Log::kDec<<"Found Inconsistency "<<ndigitcount<<" != "<<ndigitcounttest2<<ENDLOG;
862 Bool_t AliL3RawDataFileHandler::RawData2CompBinary(Int_t event)
867 AliL3DigitRowData *digits=0;
868 digits = RawData2Memory(ndigits,event);
869 out = Memory2CompBinary(ndigits,digits);