Allow up-to oversampling 4
[u/mrichter/AliRoot.git] / FMD / scripts / RawTest.C
1 //
2 // $Id$
3 //
4 // Small script to test consistency of writing and reading raw data.
5 //
6 /** Check raw data I/O
7     @ingroup simple_script
8  */
9 void
10 RawTest() 
11 {
12   gRandom->SetSeed(12345);
13   Int_t   sampleRate   = 4;
14   Int_t   channelWidth = 128;
15   Float_t shapingTime  = 5;
16   UInt_t  maxAdc       = (1 << 10);
17   UInt_t  threshold    = 0; // (1 << 8);
18   TArrayI outData(sampleRate * channelWidth); 
19   
20   Float_t lastTotalCharge = 0;
21   Int_t   ok = 0;
22   for (Int_t channel = 0; channel < channelWidth; channel++) {
23     Float_t totalCharge = gRandom->Uniform(0, 1);
24
25     for (Int_t sample = 0; sample < sampleRate; sample++) {
26       Float_t time   = Float_t(sample) / sampleRate + 1./sampleRate;
27       Float_t charge = (totalCharge + (lastTotalCharge - totalCharge)
28                         * TMath::Exp(-shapingTime * time));
29       UInt_t  adc    = channel; // UInt_t(maxAdc * charge);      
30       outData[channel * sampleRate + sample] = adc;
31       if (adc > threshold) ok++;
32     }
33     lastTotalCharge = totalCharge;
34   }
35   std::cout << "Total of " << outData.fN << " samples of which " 
36             << ok << " of them are above threshold (" << threshold 
37             << ")" << std::endl;
38   
39   { 
40     AliAltroBuffer buffer("FMD_4096.ddl", new AliFMDAltroMapping());
41     buffer.WriteDataHeader(kTRUE, kFALSE);
42     buffer.WriteChannel(0, 0, 0, outData.fN, outData.fArray, threshold);
43     buffer.Flush();
44     buffer.WriteDataHeader(kFALSE, kFALSE);
45   }
46   
47   AliRawReader* reader = new AliRawReaderFile(-1);
48   if (!reader) {
49     std::cerr << "Failed to make AliRawReader" << endl;
50     return 0;
51   }
52   AliFMDRawStream input(reader); // , sampleRate);
53   reader->Select(12); // AliFMDParameters::kBaseDDL >> 8);
54   
55   Int_t    oldDDL      = -1;
56   Int_t    count       = 0;
57   UShort_t detector    = 1; // Must be one here
58   UShort_t oldDetector = 0;
59   // Loop over data in file 
60   Bool_t   next       = kTRUE;
61
62   // local Cache 
63   TArrayI counts(10);
64   counts.Reset(-1);
65   Int_t offset = 0;
66   UInt_t ddl    = 0;
67   UInt_t rate   = 0;
68   UInt_t last   = 0;
69   UInt_t hwaddr = 0;
70   UShort_t data[2048];
71
72   AliFMDParameters* pars = AliFMDParameters::Instance();
73   TArrayI inputData(sampleRate * channelWidth); 
74   Bool_t isGood = true;
75   while (next) {
76     isGood = input.ReadChannel(ddl, hwaddr, last, data);
77     ddl = 0;
78     
79     std::cout << Form("Read channel %p 0x%x of size %d", ddl, hwaddr, last)
80               << std::endl;
81     UShort_t det, sec, str;
82     Char_t   ring;
83     if (!pars->Hardware2Detector(ddl, hwaddr, det, ring, sec, str)) {
84       std::cerr << Form("Failed to get detector id from DDL %d "
85                         "and hardware address 0x%x", ddl, hwaddr) << std::endl;
86       continue;
87     }
88     rate           = pars->GetSampleRate(det, ring, sec, str);
89     Int_t stripMin = pars->GetMinStrip(det, ring, sec, str);
90     Int_t stripMax = pars->GetMaxStrip(det, ring, sec, str);
91     std::cout << Form("DDL 0x%04x, address 0x%03x maps to FMD%d%c[%2d,%3d]", 
92                       ddl, hwaddr, det, ring, sec, str) << std::endl;
93     
94     // Loop over the `timebins', and make the digits
95     for (size_t i = 0; i < last; i++) {
96       Int_t in  = data[i];
97       Int_t out = outData[channel * sampleRate + sample];
98       std::cout << "[\t" << channel << ",\t" << sample  << "]\t" 
99                 << out << "\t" << in << std::flush; 
100       if (out >= threshold && in != out) std::cout << "\tBad" << std::flush;
101     }
102 #if 0
103     next = input.Next();
104
105     if (!next) break;
106
107     Int_t  channel = input.Strip();
108     Int_t  sample  = input.Sample();
109     inputData[channel * sampleRate + sample] = input.Count();
110     count++;
111
112     Int_t in  = inputData[channel * sampleRate + sample];
113     Int_t out = outData[channel * sampleRate + sample];
114     std::cout << "[\t" << channel << ",\t" << sample  << "]\t" 
115               << out << "\t" << in << std::flush; 
116     if (out >= threshold && in != out) std::cout << "\tBad" << std::flush;
117     std::cout << std::endl;    
118 #endif
119   }
120
121   std::cout << "Read " << count << " values" << std::endl;
122 #if 0
123   for (Int_t channel = channelWidth - 1; channel > 0; channel--) {
124     for (Int_t sample =  sampleRate - 1; sample > 0; sample--) {
125       Int_t in  = inputData[channel * sampleRate + sample];
126       Int_t out = outData[channel * sampleRate + sample];
127       std::cout << "[\t" << channel << ",\t" << sample  << "]\t" 
128                 << out << "\t" << in << std::flush; 
129       if (out >= threshold && in != out) std::cout << "\tBad" << std::flush;
130       std::cout << std::endl; 
131     }
132   }
133 #endif
134 }
135
136 //____________________________________________________________________
137 //
138 // EOF
139 //
140   
141     
142         
143     
144       
145   
146     
147