ROOT logo
//
// $Id$
//
// Small script to test consistency of writing and reading raw data.
//
/** Check raw data I/O
    @ingroup simple_script
 */
void
RawTest() 
{
  gRandom->SetSeed(12345);
  Int_t   sampleRate   = 4;
  Int_t   channelWidth = 128;
  Float_t shapingTime  = 5;
  UInt_t  maxAdc       = (1 << 10);
  UInt_t  threshold    = 0; // (1 << 8);
  TArrayI outData(sampleRate * channelWidth); 
  
  Float_t lastTotalCharge = 0;
  Int_t   ok = 0;
  for (Int_t channel = 0; channel < channelWidth; channel++) {
    Float_t totalCharge = gRandom->Uniform(0, 1);

    for (Int_t sample = 0; sample < sampleRate; sample++) {
      Float_t time   = Float_t(sample) / sampleRate + 1./sampleRate;
      Float_t charge = (totalCharge + (lastTotalCharge - totalCharge)
			* TMath::Exp(-shapingTime * time));
      UInt_t  adc    = channel; // UInt_t(maxAdc * charge);      
      outData[channel * sampleRate + sample] = adc;
      if (adc > threshold) ok++;
    }
    lastTotalCharge = totalCharge;
  }
  std::cout << "Total of " << outData.fN << " samples of which " 
	    << ok << " of them are above threshold (" << threshold 
	    << ")" << std::endl;
  
  { 
    AliAltroBuffer buffer("FMD_4096.ddl", new AliFMDAltroMapping());
    buffer.WriteDataHeader(kTRUE, kFALSE);
    buffer.WriteChannel(0, 0, 0, outData.fN, outData.fArray, threshold);
    buffer.Flush();
    buffer.WriteDataHeader(kFALSE, kFALSE);
  }
  
  AliRawReader* reader = new AliRawReaderFile(-1);
  if (!reader) {
    std::cerr << "Failed to make AliRawReader" << endl;
    return 0;
  }
  AliFMDRawStream input(reader); // , sampleRate);
  reader->Select(12); // AliFMDParameters::kBaseDDL >> 8);
  
  Int_t    oldDDL      = -1;
  Int_t    count       = 0;
  UShort_t detector    = 1; // Must be one here
  UShort_t oldDetector = 0;
  // Loop over data in file 
  Bool_t   next       = kTRUE;

  // local Cache 
  TArrayI counts(10);
  counts.Reset(-1);
  Int_t offset = 0;
  UInt_t ddl    = 0;
  UInt_t rate   = 0;
  UInt_t last   = 0;
  UInt_t hwaddr = 0;
  UShort_t data[2048];

  AliFMDParameters* pars = AliFMDParameters::Instance();
  TArrayI inputData(sampleRate * channelWidth); 
  Bool_t isGood = true;
  while (next) {
    isGood = input.ReadChannel(ddl, hwaddr, last, data);
    ddl = 0;
    
    std::cout << Form("Read channel %p 0x%x of size %d", ddl, hwaddr, last)
	      << std::endl;
    UShort_t det, sec, str;
    Char_t   ring;
    if (!pars->Hardware2Detector(ddl, hwaddr, det, ring, sec, str)) {
      std::cerr << Form("Failed to get detector id from DDL %d "
			"and hardware address 0x%x", ddl, hwaddr) << std::endl;
      continue;
    }
    rate           = pars->GetSampleRate(det, ring, sec, str);
    Int_t stripMin = pars->GetMinStrip(det, ring, sec, str);
    Int_t stripMax = pars->GetMaxStrip(det, ring, sec, str);
    std::cout << Form("DDL 0x%04x, address 0x%03x maps to FMD%d%c[%2d,%3d]", 
		      ddl, hwaddr, det, ring, sec, str) << std::endl;
    
    // Loop over the `timebins', and make the digits
    for (size_t i = 0; i < last; i++) {
      Int_t in  = data[i];
      Int_t out = outData[channel * sampleRate + sample];
      std::cout << "[\t" << channel << ",\t" << sample  << "]\t" 
		<< out << "\t" << in << std::flush; 
      if (out >= threshold && in != out) std::cout << "\tBad" << std::flush;
    }
#if 0
    next = input.Next();

    if (!next) break;

    Int_t  channel = input.Strip();
    Int_t  sample  = input.Sample();
    inputData[channel * sampleRate + sample] = input.Count();
    count++;

    Int_t in  = inputData[channel * sampleRate + sample];
    Int_t out = outData[channel * sampleRate + sample];
    std::cout << "[\t" << channel << ",\t" << sample  << "]\t" 
	      << out << "\t" << in << std::flush; 
    if (out >= threshold && in != out) std::cout << "\tBad" << std::flush;
    std::cout << std::endl;    
#endif
  }

  std::cout << "Read " << count << " values" << std::endl;
#if 0
  for (Int_t channel = channelWidth - 1; channel > 0; channel--) {
    for (Int_t sample =  sampleRate - 1; sample > 0; sample--) {
      Int_t in  = inputData[channel * sampleRate + sample];
      Int_t out = outData[channel * sampleRate + sample];
      std::cout << "[\t" << channel << ",\t" << sample  << "]\t" 
		<< out << "\t" << in << std::flush; 
      if (out >= threshold && in != out) std::cout << "\tBad" << std::flush;
      std::cout << std::endl; 
    }
  }
#endif
}

//____________________________________________________________________
//
// EOF
//
  
    
	
    
      
  
    
  
 RawTest.C:1
 RawTest.C:2
 RawTest.C:3
 RawTest.C:4
 RawTest.C:5
 RawTest.C:6
 RawTest.C:7
 RawTest.C:8
 RawTest.C:9
 RawTest.C:10
 RawTest.C:11
 RawTest.C:12
 RawTest.C:13
 RawTest.C:14
 RawTest.C:15
 RawTest.C:16
 RawTest.C:17
 RawTest.C:18
 RawTest.C:19
 RawTest.C:20
 RawTest.C:21
 RawTest.C:22
 RawTest.C:23
 RawTest.C:24
 RawTest.C:25
 RawTest.C:26
 RawTest.C:27
 RawTest.C:28
 RawTest.C:29
 RawTest.C:30
 RawTest.C:31
 RawTest.C:32
 RawTest.C:33
 RawTest.C:34
 RawTest.C:35
 RawTest.C:36
 RawTest.C:37
 RawTest.C:38
 RawTest.C:39
 RawTest.C:40
 RawTest.C:41
 RawTest.C:42
 RawTest.C:43
 RawTest.C:44
 RawTest.C:45
 RawTest.C:46
 RawTest.C:47
 RawTest.C:48
 RawTest.C:49
 RawTest.C:50
 RawTest.C:51
 RawTest.C:52
 RawTest.C:53
 RawTest.C:54
 RawTest.C:55
 RawTest.C:56
 RawTest.C:57
 RawTest.C:58
 RawTest.C:59
 RawTest.C:60
 RawTest.C:61
 RawTest.C:62
 RawTest.C:63
 RawTest.C:64
 RawTest.C:65
 RawTest.C:66
 RawTest.C:67
 RawTest.C:68
 RawTest.C:69
 RawTest.C:70
 RawTest.C:71
 RawTest.C:72
 RawTest.C:73
 RawTest.C:74
 RawTest.C:75
 RawTest.C:76
 RawTest.C:77
 RawTest.C:78
 RawTest.C:79
 RawTest.C:80
 RawTest.C:81
 RawTest.C:82
 RawTest.C:83
 RawTest.C:84
 RawTest.C:85
 RawTest.C:86
 RawTest.C:87
 RawTest.C:88
 RawTest.C:89
 RawTest.C:90
 RawTest.C:91
 RawTest.C:92
 RawTest.C:93
 RawTest.C:94
 RawTest.C:95
 RawTest.C:96
 RawTest.C:97
 RawTest.C:98
 RawTest.C:99
 RawTest.C:100
 RawTest.C:101
 RawTest.C:102
 RawTest.C:103
 RawTest.C:104
 RawTest.C:105
 RawTest.C:106
 RawTest.C:107
 RawTest.C:108
 RawTest.C:109
 RawTest.C:110
 RawTest.C:111
 RawTest.C:112
 RawTest.C:113
 RawTest.C:114
 RawTest.C:115
 RawTest.C:116
 RawTest.C:117
 RawTest.C:118
 RawTest.C:119
 RawTest.C:120
 RawTest.C:121
 RawTest.C:122
 RawTest.C:123
 RawTest.C:124
 RawTest.C:125
 RawTest.C:126
 RawTest.C:127
 RawTest.C:128
 RawTest.C:129
 RawTest.C:130
 RawTest.C:131
 RawTest.C:132
 RawTest.C:133
 RawTest.C:134
 RawTest.C:135
 RawTest.C:136
 RawTest.C:137
 RawTest.C:138
 RawTest.C:139
 RawTest.C:140
 RawTest.C:141
 RawTest.C:142
 RawTest.C:143
 RawTest.C:144
 RawTest.C:145
 RawTest.C:146
 RawTest.C:147
 RawTest.C:148