exner 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/.autotest +23 -0
  2. data/.gemtest +0 -0
  3. data/History.txt +4 -0
  4. data/Manifest.txt +42 -0
  5. data/README.txt +49 -0
  6. data/Rakefile +19 -0
  7. data/bin/rorschach +4 -0
  8. data/bin/zulliger +4 -0
  9. data/data/.~lock.sumario_Zulliger.rtf# +1 -0
  10. data/data/Rorschach_Zest.txt +50 -0
  11. data/data/Zulliger_Zest.txt +50 -0
  12. data/data/sumario.rtf +240 -0
  13. data/data/sumario2.rtf +271 -0
  14. data/data/sumario_Rorschach.rtf +233 -0
  15. data/data/sumario_Zulliger.rtf +203 -0
  16. data/data/test_manchas.txt +16 -0
  17. data/data/zulli_test.txt +11 -0
  18. data/lib/exner/respuesta.rb +110 -0
  19. data/lib/exner/rorschach.rb +11 -0
  20. data/lib/exner/rorschach_plugins/cdi.rb +22 -0
  21. data/lib/exner/rorschach_plugins/depi.rb +38 -0
  22. data/lib/exner/rorschach_plugins/hvi.rb +25 -0
  23. data/lib/exner/rorschach_plugins/interpretacion.rb +438 -0
  24. data/lib/exner/rorschach_plugins/obs.rb +36 -0
  25. data/lib/exner/rorschach_plugins/scon.rb +44 -0
  26. data/lib/exner/rorschach_plugins/sczi.rb +25 -0
  27. data/lib/exner/rtf/rorschach.rb +69 -0
  28. data/lib/exner/rtf/zulliger.rb +59 -0
  29. data/lib/exner/rtf.rb +46 -0
  30. data/lib/exner/test_manchas.rb +445 -0
  31. data/lib/exner/zulliger.rb +26 -0
  32. data/lib/exner/zulliger_plugins/interpretacion.rb +328 -0
  33. data/lib/exner.rb +44 -0
  34. data/test/extras.rb +11 -0
  35. data/test/helpers_tests.rb +41 -0
  36. data/test/test_depi.rb +29 -0
  37. data/test/test_exner.rb +100 -0
  38. data/test/test_hvi.rb +33 -0
  39. data/test/test_obs.rb +29 -0
  40. data/test/test_rorschach.rb +1 -0
  41. data/test/test_scon.rb +34 -0
  42. data/test/test_sczi.rb +29 -0
  43. data/test/text_cdi.rb +28 -0
  44. data.tar.gz.sig +0 -0
  45. metadata +193 -0
  46. metadata.gz.sig +0 -0
data/lib/exner/rtf.rb ADDED
@@ -0,0 +1,46 @@
1
+ # -encoding: UTF-8
2
+ module Exner
3
+ module Rtf
4
+ def _dcp(c)
5
+ _ds[c.gsub('C',"C'")]
6
+ end
7
+ def _cd(c)
8
+ c+" = "+_f['contenidos_1'][c].to_s+","+_f['contenidos_2'][c].to_s
9
+ end
10
+ def detRtf
11
+ s=""
12
+ @respuestas.each {|n,r|
13
+ s+="\n\\par "+r.determinantes.join('.')+r.fq if r.determinantes.size>1
14
+ }
15
+ s
16
+ end
17
+ def _ds
18
+ determinantes_simples
19
+ end
20
+ def superscript(a)
21
+ '{{\*\updnprop5801}\up8 '+a+'}'
22
+ end
23
+ def _res_enf
24
+ a=resumen_del_enfoque.collect {|lam|
25
+ Exner.a_romano(lam[0])+":"+lam[1].join(',')
26
+ }.join("\n\\par ")+"\n"
27
+ end
28
+ def _lq(tipo)
29
+ s=''
30
+ Exner::FQ_VALIDAS.each {|fq|
31
+ s+=fq+":"+_f[tipo][fq].to_s+"\n\\par "
32
+ }
33
+ s
34
+ end
35
+ def ldq
36
+ s=''
37
+ Exner::DQ_VALIDAS.each {|dq|
38
+ s+=dq+":"+_f['dq'][dq].to_s+"\n\\par "
39
+ }
40
+ s
41
+ end
42
+ end
43
+ end
44
+ require 'exner/rtf/zulliger'
45
+ require 'exner/rtf/rorschach'
46
+
@@ -0,0 +1,445 @@
1
+ # -encoding: UTF-8
2
+ module Exner
3
+ class TestManchas
4
+ FRECUENCIAS=%w{localizacion dq contenidos contenidos_1 contenidos_2 determinantes ccee fqx fqf mq sqx wqx dqx wdx pares}
5
+ attr_reader :respuestas, :laminas, :zf,:zsum, :frecuencias, :complejos, :sencillos, :msumm, :pares, :populares, :extras, :tipos_contenidos
6
+ ZEST_FILE=''
7
+ def initialize
8
+ @zf= @zsum= @pares= @populares=@tipos_contenidos= 0
9
+ @respuestas=Hash.new
10
+ @laminas=Hash.new
11
+ @frecuencias=Hash.new
12
+ @complejos=Array.new
13
+ @extras=Array.new
14
+ FRECUENCIAS.each {|i|
15
+ @frecuencias[i]=Hash.new
16
+ }
17
+ LOC_VALIDAS.each {|i|
18
+ @frecuencias['localizacion'][i]=0;
19
+ }
20
+ DQ_VALIDAS.each {|i|
21
+ @frecuencias['dq'][i]=0;
22
+ }
23
+ DET_VALIDOS.each {|i|
24
+ @frecuencias['determinantes'][i]=0;
25
+ }
26
+ CONT_VALIDOS.each {|i|
27
+ @frecuencias['contenidos'][i]=0;
28
+ @frecuencias['contenidos_1'][i]=0;
29
+ @frecuencias['contenidos_2'][i]=0;
30
+ }
31
+ CCEE_VALIDOS.each {|i|
32
+ @frecuencias['ccee'][i]=0;
33
+ }
34
+ FQ_VALIDAS.each {|i|
35
+ @frecuencias['fqx'][i]=0;
36
+ @frecuencias['fqf'][i]=0;
37
+ @frecuencias['mq'][i]=0;
38
+ @frecuencias['sqx'][i]=0;
39
+ @frecuencias['wqx'][i]=0;
40
+ @frecuencias['dqx'][i]=0;
41
+ @frecuencias['wdx'][i]=0;
42
+ }
43
+
44
+ end
45
+ def _d
46
+ @frecuencias['determinantes']
47
+ end
48
+ def _c
49
+ @frecuencias['contenidos']
50
+ end
51
+ def _ccee
52
+ @frecuencias['ccee']
53
+ end
54
+ def _f
55
+ @frecuencias
56
+ end
57
+ def _l
58
+ localizaciones
59
+ end
60
+
61
+ def zest
62
+ aEst=Exner::open_zest(self.ZEST_FILE)
63
+ aEst[@zf]
64
+ end
65
+ def open_stream(stream)
66
+ stream.each_line {|linea|
67
+ resp=Exner::Respuesta.new(self,linea)
68
+ lam=resp.lamina
69
+ @laminas[lam]=Array.new if @laminas[lam].nil?
70
+ raise "no pueden existir dos respuestas con el mismo número" if @respuestas.has_key?(resp.respuesta)
71
+ @respuestas[resp.respuesta]=resp
72
+ @laminas[lam].push(resp)
73
+ }
74
+ end
75
+ def open_file(file)
76
+ raise "No se definió archivo" if file.nil?
77
+ File.open(file,'r') {|file|
78
+ open_stream(file)
79
+ }
80
+ end
81
+ def each_determinante
82
+ @respuestas.each {|n,resp| resp.determinantes.each {|det| yield det }}
83
+ end
84
+ def obtenerZ(lamina,tipo)
85
+ return @laminas_z[lamina][tipo]
86
+ end
87
+ def procesar
88
+ @respuestas.each do |n,resp|
89
+ @zf+=1 if resp.z >0
90
+ @zsum+=resp.z
91
+ @pares+=1 if resp.par
92
+ @populares+=1 if resp.popular
93
+ raise "No existe localizacion para la respuesta "+n.to_s if resp.localizacion.nil?
94
+ @frecuencias['localizacion'][resp.localizacion]+=1
95
+ @frecuencias['dq'][resp.dq]+=1
96
+ @frecuencias['fqx'][resp.fq]+=1
97
+ @frecuencias['fqf'][resp.fq]+=1 if resp.determinantes==['F']
98
+ @frecuencias['mq'][resp.fq]+=1 if resp.tiene_movimiento_humano?
99
+ @frecuencias['sqx'][resp.fq]+=1 if resp.localizacion=~/S/
100
+ @frecuencias['wqx'][resp.fq]+=1 if resp.localizacion_pura=='W'
101
+ @frecuencias['dqx'][resp.fq]+=1 if resp.localizacion_pura=='D'
102
+ @frecuencias['wdx'][resp.fq]+=1 if resp.localizacion_pura=='W' or resp.localizacion_pura=='D'
103
+ @complejos.push(resp) if resp.determinantes.size>1
104
+ resp.determinantes.each {|d|
105
+ @frecuencias['determinantes'][d]+=1
106
+ }
107
+ cp=true
108
+ resp.contenidos.each {|d|
109
+ @frecuencias['contenidos'][d]+=1
110
+ @tipos_contenidos+=1 if @frecuencias['contenidos'][d]==1
111
+ if cp
112
+ @frecuencias['contenidos_1'][d]+=1
113
+ cp=false
114
+ else
115
+ @frecuencias['contenidos_2'][d]+=1
116
+ end
117
+
118
+ }
119
+ resp.ccee.each {|d|
120
+ @frecuencias['ccee'][d]+=1
121
+ }
122
+ end
123
+ procesar_extras
124
+ end
125
+ def procesar_extras
126
+ Dir[Exner.dir_root+'/exner/'+self.class.to_s.gsub('Exner::','').downcase+'_plugins/*.rb'].each {|file|
127
+ require file
128
+ }
129
+
130
+ end
131
+ def localizaciones
132
+ res=Hash.new
133
+ locs=%w{W Wv D Dd S}
134
+ locs.each {|i| res[i]=0}
135
+ @respuestas.each {|n,resp|
136
+ res['W']+=1 if resp.localizacion_pura=='W'
137
+ res['Wv']+=1 if resp.localizacion_pura=='W' and resp.dq=='v'
138
+ res['D']+=1 if resp.localizacion_pura=='D'
139
+ res['Dd']+=1 if resp.localizacion_pura=='Dd'
140
+ res['S']+=1 if resp.localizacion=~/S/
141
+ }
142
+ res
143
+ end
144
+ def determinantes_simples
145
+ res=@frecuencias['determinantes'].dup
146
+ ['M','FM','m'].each {|mov|
147
+ res[mov]=res[mov+'a']+res[mov+'p']
148
+ res.delete(mov+'a')
149
+ res.delete(mov+'p')
150
+ }
151
+ res['(2)']=@pares
152
+ res
153
+ end
154
+
155
+ def msum
156
+ sumdet('M')
157
+ end
158
+ # sumatoria de color ponderado
159
+ def det
160
+ @frecuencias['determinantes']
161
+ end
162
+ def sumcolpond
163
+ _d['C']*1.5+_d['CF']+_d['FC']*0.5
164
+ end
165
+
166
+ # sumatoria de items de un determinado tipo
167
+ def sumdet(tipo)
168
+ suma=0
169
+ each_determinante {|det|
170
+ if tipo=='M'
171
+ suma+=1 if det=='Ma' or det=='Mp'
172
+ elsif tipo=='FD'
173
+ suma+=1 if det=='FD'
174
+ elsif tipo=='C'
175
+ suma+=1 if det=='C' or det=='FC' or det=='CF'
176
+ elsif tipo=='Cn'
177
+ suma+=1 if det=='Cn'
178
+ elsif tipo=='F'
179
+ suma+1 if det=='F'
180
+ else
181
+ det=det.gsub(/[ap]/,'')
182
+ suma+=1 if det=~/#{tipo}/
183
+ end
184
+ }
185
+ suma
186
+ end
187
+ def resumen_del_enfoque
188
+ res=Hash.new
189
+ @laminas.each {|ln,resps|
190
+ resps.sort.each {|resp|
191
+ res[ln]=Array.new if res[ln].nil?
192
+ res[ln].push(resp.localizacion_pura)
193
+ }
194
+ }
195
+ res.sort
196
+ end
197
+ # Controles
198
+ def R
199
+ @respuestas.size
200
+ end
201
+ def L
202
+ fp=0.0
203
+ @respuestas.each {|n,resp|
204
+ fp+=1 if resp.determinantes==['F']
205
+ }
206
+ return fp.to_f / (self.R-fp)
207
+ end
208
+ def EB
209
+ sumdet('M').to_s+":"+sumcolpond.to_s
210
+ end
211
+ def EA
212
+ (msum+sumcolpond).to_f
213
+ end
214
+ def eb_izq
215
+ (sumdet('FM')+sumdet('m'))
216
+ end
217
+ def eb_der
218
+ (sumdet('T')+sumdet('V')+sumdet("C'")+ sumdet('Y'))
219
+ end
220
+ def eb
221
+ eb_izq.to_s+":"+eb_der.to_s
222
+ end
223
+ def es
224
+ eb_izq+eb_der
225
+ end
226
+ def Adjes
227
+ madj=(sumdet('m')>0) ? 1:0;
228
+ yadj=(sumdet('Y')>0) ? 1:0;
229
+ sumdet('FM')+madj+(sumdet('T')+sumdet('V')+sumdet("C'")+ yadj)
230
+ end
231
+ def EBPer
232
+ if (((msum-sumcolpond).abs<=2 and self.EA<=10) or
233
+ self.EA>10)
234
+ if msum>sumcolpond
235
+ msum/sumcolpond
236
+ else
237
+ sumcolpond/msum
238
+ end
239
+ else
240
+ false
241
+ end
242
+ end
243
+ def Dscore(d)
244
+ return 0 if d>=-2.5 and d<=2.5
245
+ (((d.abs-3)/2.5)+1).to_i*(d<0 ? -1:+1)
246
+ end
247
+ def D
248
+ Dscore(self.EA-es)
249
+ end
250
+ def AdjD
251
+ Dscore(self.EA-self.Adjes)
252
+ end
253
+ #Afectos
254
+
255
+ #FC:CF+C
256
+ def fc_cf_c
257
+ (det['FC']).to_s+':'+(det['CF']+det['C']).to_s
258
+ end
259
+ def sumc_wsumc
260
+ (sumdet("C'")).to_s+":"+(det['FC']*0.5+det['CF']+det['C']*1.5).to_s
261
+ end
262
+ def Afr
263
+ n=Hash.new
264
+ @laminas.each {|x,l|
265
+ n[x]=l.size
266
+ }
267
+ (n[8]+n[9]+n[10]).to_f/(n[1]+n[2]+n[3]+n[4]+n[5]+n[6]+n[7]).to_f
268
+ end
269
+ def complj_r
270
+ porcentaje(@complejos.size)
271
+ end
272
+ def CP
273
+ @frecuencias['ccee']['CP']
274
+ end
275
+ #interpersonal
276
+ def COP
277
+ @frecuencias['ccee']['COP']
278
+ end
279
+ def Fd
280
+ @frecuencias['contenidos']['Fd']
281
+ end
282
+ def AG
283
+ @frecuencias['ccee']['AG']
284
+ end
285
+ def aislamiento_r
286
+ c=@frecuencias['contenidos']
287
+ (2*c['Na']+2*c['Cl']+c['Bt']+c['Ls']+c['Ge']).to_f/self.R
288
+ end
289
+ def h_h_hd_hd
290
+ _c['H'].to_s+':'+(_c['(H)']+_c['Hd']+_c['(Hd)']).to_s
291
+ end
292
+ def p_h_hd_p_a_ad
293
+ c=@frecuencias['contenidos']
294
+ (c['(H)']+c['(Hd)']).to_s+':'+(c['(A)']+c['(Ad)']).to_s
295
+
296
+ end
297
+ def h_a_hd_ad
298
+ c=@frecuencias['contenidos']
299
+ (c['H']+c['A']).to_s+':'+(c['Hd']+c['Ad']).to_s
300
+ end
301
+ def a_porciento
302
+ c=@frecuencias['contenidos']
303
+ porcentaje(c['A']+c['Ad'])
304
+ end
305
+ def porcentaje(valor)
306
+ return valor.to_f/self.R
307
+ end
308
+ #Ideación
309
+ def suma_preg(p)
310
+ suma=0
311
+ each_determinante {|det| suma+=1 if det=~/#{p}/ }
312
+ suma
313
+ end
314
+ def activos
315
+ suma_preg('a')
316
+ end
317
+ def pasivos
318
+ suma_preg('p')
319
+ end
320
+ def a_p
321
+ activos.to_s+":"+pasivos.to_s
322
+ end
323
+ def Ma_Mp
324
+ a=p=0
325
+ each_determinante {|det|
326
+ if(det=='Ma' or det=='Mp')
327
+ a+=1 if det=~/a/
328
+ p+=1 if det=~/p/
329
+ end
330
+ }
331
+ a.to_s+":"+p.to_s
332
+ end
333
+ def intelectualizacion
334
+ c=@frecuencias['contenidos']
335
+ 2*@frecuencias['ccee']['AB']+(c['Art']+c['Ay'])
336
+ end
337
+ def m_menos
338
+ @frecuencias['mq']['-']
339
+ end
340
+ def SumBr6
341
+ suma=0
342
+ @respuestas.each {|n,resp|
343
+ resp.ccee.each {|ccee|
344
+ suma+=1 if CCEE_IDEACION.has_key?(ccee)
345
+ }
346
+ }
347
+ suma
348
+ end
349
+ def SumPon6
350
+ suma=0
351
+ @respuestas.each {|n,resp|
352
+ resp.ccee.each {|ccee|
353
+ suma+=CCEE_IDEACION[ccee] if CCEE_IDEACION.has_key?(ccee)
354
+ }
355
+ }
356
+ suma
357
+ end
358
+ def nvl2
359
+ suma=0
360
+ @respuestas.each {|n,resp|
361
+ resp.ccee.each {|ccee|
362
+ suma+=1 if CCEE_IDEACION.has_key?(ccee) and ccee=~/2/
363
+ }
364
+ }
365
+ suma
366
+ end
367
+ def msin
368
+ suma=0
369
+ @respuestas.each {|n,resp|
370
+ suma+=1 if resp.fq=='sin' and resp.determinantes.detect {|a| a=='Ma' or a=='Mp'}
371
+ }
372
+ suma
373
+ end
374
+ # mediacion
375
+ def P
376
+ @populares
377
+ end
378
+ def xmas
379
+ (@frecuencias['fqx']['o']+@frecuencias['fqx']['+']).to_f/self.R
380
+ end
381
+ def fmas
382
+ (@frecuencias['fqf']['o']+@frecuencias['fqf']['+']).to_f/ determinantes_simples['F']
383
+ end
384
+ def xmenos
385
+ @frecuencias['fqx']['-'].to_f/self.R
386
+ end
387
+ def smenos
388
+ @frecuencias['sqx']['-'].to_f/@frecuencias['fqx']['-']
389
+
390
+ end
391
+ def xu
392
+ @frecuencias['fqx']['u'].to_f/self.R
393
+ end
394
+ def xa
395
+ (@frecuencias['fqx']['o']+@frecuencias['fqx']['+']+ @frecuencias['fqx']['u']).to_f/self.R
396
+ end
397
+ def wda
398
+ wdx=@frecuencias['wdx']
399
+ loc=localizaciones
400
+ (wdx['+']+wdx['o']+wdx['u']).to_f/(loc['W']+loc['D'])
401
+ end
402
+ #Procesamiento
403
+ def Zf
404
+ @zf
405
+ end
406
+ def Zd
407
+ @zsum-zest
408
+ end
409
+ def w_d_dd
410
+ l=localizaciones
411
+ sprintf("%d:%d:%d",l['W'],l['D'],l['Dd'])
412
+ end
413
+ def w_m
414
+ l=localizaciones
415
+ sprintf("%d:%d",l['W'],determinantes_simples['M'])
416
+ end
417
+ def dqmas
418
+ @frecuencias['dq']['+']
419
+ end
420
+ def dqv
421
+ @frecuencias['dq']['v']
422
+ end
423
+ # autopercepcion
424
+ def autocentracion
425
+ (3*sumdet('r')+@pares).to_f/self.R
426
+ end
427
+ def fr_rf
428
+ sumdet('r')
429
+ end
430
+ def FD
431
+ @frecuencias['determinantes']['FD']
432
+ end
433
+ def an_xy
434
+ @frecuencias['contenidos']['An']+@frecuencias['contenidos']['Xy']
435
+ end
436
+ def mor
437
+ @frecuencias['ccee']['MOR']
438
+ end
439
+ end
440
+
441
+
442
+ end
443
+
444
+ require 'exner/rorschach'
445
+ require 'exner/zulliger'
@@ -0,0 +1,26 @@
1
+ # -encoding: UTF-8
2
+ module Exner
3
+ class Zulliger < TestManchas
4
+ def initialize
5
+ @laminas_z={
6
+ 1=>{'a'=>1.0,'b'=>4.0,'c'=>6.0,'d'=>3.5},
7
+ 2=>{'a'=>5.5,'b'=>3.0,'c'=>3.0,'d'=>4.0},
8
+ 3=>{'a'=>5.5,'b'=>3.0,'c'=>4.0,'d'=>4.5}
9
+ }
10
+ super
11
+ end
12
+ def ZEST_FILE
13
+ Exner.dir_data+'/Zulliger_Zest.txt'
14
+ end
15
+ def N
16
+ 3
17
+ end
18
+ def Afr
19
+ n=Hash.new
20
+ @laminas.each {|x,l|
21
+ n[x]=l.size
22
+ }
23
+ n[2].to_f/(n[1]+n[3]).to_f
24
+ end
25
+ end
26
+ end